Сценарии
Сценарии
могут использоваться в
документах XSL
точно также, как и в HTML.
Кроме того, сценарии,
содержащиеся внутри XSL-документа
и запускаемые броузером в
процессе обработки
документа могут
динамически создавать HTML-документы,
извлекая необходимую для
этого информацию
непосредственно из
элементов XSL-документа.
Для
написания сценариев XSL
использует специальный
скриптовый язык - ECMAScript.
Однако в msxsl для
этих целей можно применять
Microsoft JavaScript,- язык, который
объединил в себе некоторые
элементы стандартного JavaScript
и ECMAScript.
Вычисление
выражений
Наиболее
простым примером
использования сценариев в XSL
-документе является
вычисление значений
параметров описываемых
элементов. Для этого надо
просто поставить знак
равенства в качестве
первого символа параметра,
что заставит XSL-процессор
вычислить значение
выражения(синтаксис этого
выражения должен отвечать
требованиям JavaScript).
Например, после разбора
этого правила:
<rule>
<target-element type="header">
<hr width="=100-20+'%'">
<children/>
<hr width="80%">
</rule>
, в
выходном документе
окажутся следующие
инструкции:
<hr width=80%>
...
<hr width=80%>
Очень
часто в правилах XSL
необходимо использовать
атрибуты описываемого в
них элемента. Для этого мы
должны воспользоваться
методом getAttribute(),
описанным в объектной
модели XML (мы
рассматриваем объектную
модель XML-документов,
предложенную Microsoft,
список этих функций
приведен в конце раздела).
Т.к. каждому элементу XSL
доступен указатель на
соответствующий ему
объект, сценарий может
обращаться к внутренним
функциям и свойствам этих
элементов, при помощи
которых и осуществляются
необходимые действия.
В
следующем фрагменте XML-
документа определяется
элемент <article>, в котором
атрибут src используется
для задания адреса файла,
содержащего текст статьи.
<articles>
<article src="http://server/pages/article.html">Bugs report</article>
</articles>
Для того,
чтобы использовать этот
атрибут в выходном HTML-документе,
необходимо определить
следующее правило:
<rule>
<target-element type="article">
<a href='=getAttribute("src")'>
<children/>
</a>
</rule>
После
обработки этого фрагмента
в выходной документ будет
помещен элемент:
<a href="http://server/pages/article.html">Bugs report</a>
Выполнение
инструкций
Другим
способом помещения в
выходной HTML-
документ информации,
являющейся результатом
выполнения каких-либо
операций JavaScript –
сценариев является
использовнаие инструкции <eval>;:
<rule>
<element type="articles">
<target-element type="article">
</element>
<tr><td><eval>childNumber(this)</eval></td><td>
<children/>
</td><tr>
</rule>
Метод childNumber
в данном случае возвращает
текущий номер дочернего
элемента.
Определение
функций и глобальных
переменных
Аналогично
тэгу <SCRIPT> в HTML,
элемент <define-script> содержит
функции и определения
глобальных переменных.
Обычно в XSL-документе
определяется один элемент <define-script>,
расположенный в самом
начале.
<xsl>
<define-script>
<![CDATA[
var fontSize=12;
function getColor(elem){
return elem.children.item("color",0).text;
// Возвращает содержимое дочернего элемента <color>
}]]>
</define-script>
<rule>
<target-element type = "flower">
<div background-color="=getColor(this)"; font-size="=fontSize">
<children/>
</div>
</rule>
</xsl>
Если
применить эти правила к
такому фрагменту XML-
документу:
<xml>
<flower>
rose
<color>red</color>
</flower>
, то на
выходе HTML
-документ будет содержать
следующие элементы:
<div background-color="red"; font-size="12">
Необходимо
отметить, что
использование глобальных
переменных в некоторых
случаях может приводить к
серьезным ошибкам,
вызванным попытками
одновременного к ним
доступа. Поэтому
рекомендуется
использовать такие
переменные только в
качестве констант.
Использование
Java Script для HTML
Создавая
шаблон HTML-документа,
Вы можете указывать в нем
практически любые
элементы HTML, в том
числе и блоки <SCRIPT>, внутри
которых можно задавать
любые конструкции Java
Script, используя
для этого область CDATA:
<xsl>
<rule>
<root/>
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JSCRIPT"><![CDATA[
var ie4=((navigator.appName=="Microsoft Internet Explorer")&&(parseInt(navigator.appVersion) >= 4 ));
function msover(){
if (ie4){
event.srcElement.style.color="red";
event.srcElement.style.cursor = "hand";
}
}
function msout(){
if (ie4){
event.srcElement.style.color="black";
event.srcElement.style.cursor = "auto";
}
} ]]></SCRIPT>
</HEAD>
<BODY>
<children/>
</BODY>
</HTML>
</rule>
<rule>
<target-element type="chapter"/>
<DIV id='=tagName + formatNumber(childNumber(this),"1")'
background-color="marron"
onmouseover='="msover("+ tagName + formatNumber(childNumber(this),"1")+")"'
onmouseout='="msout("+ tagName + formatNumber(childNumber(this),"1")+")"'
<children/>
</DIV>
</rule>
</xsl>
Если
использовать эти правила
для следующего XML-
документа:
<contents>
<chapter>Part1</chapter>
<chapter>Part2</chapter>
<chapter>Part3</chapter>
</contents>
то в
результате мы получим
такой HTML-файл:
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JSCRIPT">
var ie4=((navigator.appName=="Microsoft Internet Explorer")&&(parseInt(navigator.appVersion) >= 4 ));
function msover(){
if (ie4){
event.srcElement.style.color="red";
event.srcElement.style.cursor = "hand";
}
}
function msout(){
if (ie4){
event.srcElement.style.color="black";
event.srcElement.style.cursor = "auto";
}
}
</SCRIPT>
</HEAD>
<BODY>
<DIV id=''chapter1" onmouseover="msover("chapter1")"'
onmouseout="msout("chapter1")"'
Part 1
</DIV>
<DIV id=''chapter2" onmouseover="msover("chapter2")"'
onmouseout="msout("chapter2")"'
Part 2
</DIV>
<DIV id=''chapter3" onmouseover="msover("chapter3")"'
onmouseout="msout("chapter3")"'
Part 3
</DIV>
</BODY>
</HTML>
Встроенные
функции XSL
В
завершении приведем
список внутренних функций,
которые можно
использовать в JavaScript
–сценариях,
предназначенных для
анализатора msxsl:
Ancestor(elementType,
elem) |
Возвращает
для текущего элемента
ссылку на ближайший
родительский элемент
заданного типа. Если
такого элемента нет
или текущий элемент
пустой, то возвращает
null |
ChildNumber(elem) |
Возвращает
индекс текущего
элемента в списке
других дочерних
элементов данного
типа. |
AncestorChildNumber() |
Возвращает
номер ближайшего
предка текущего
элемента или null, если
такового не
существует |
path(xsl) |
Возвращает
массив, содержащий
"путь" к текущему
элементу - в каждую
ячейку этого массива
помещается цифровое
значение, указывающее
на количество
элементов одинакового
типа, находящихся на
текущем уровне
вложенности. Первым
значением этого
массива будет
представлен корневой
элемент, последним -
текущий. Размер
массива определяет
глубину вложенности
текущего элемента. |
HierarchicalNumberRecursive(elementType,elem) |
Метод,
похожий на метод path, но
возвращает только
дочерние элементы |
FormatNumber(n,format) |
Возвращает
строку - символьное
представление
номера(т.е. "один",
"два" и т.д.).
Возможно определение
следующих форматов:
"1" - 0,1,2,..
"01" - 01,02,03,...
"a" - a,b,c,..z, aa, ab,..zz
"A" - A,..,Z,AA, .. ZZ |
FormatNumberList(list,format,separator) |
Возвращает
строку,
представляющую
список, элементами
которого являются
символьные
представления чисел |
назад
содержание
вперед
|